bitkeeper revision 1.1159.223.1 (41eced1denT_MsS4LtXTQroXHucvZA)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 18 Jan 2005 11:03:57 +0000 (11:03 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Tue, 18 Jan 2005 11:03:57 +0000 (11:03 +0000)
Fix small-packet delivery in netback driver.

linux-2.6.10-xen-sparse/drivers/xen/netback/netback.c
linux-2.6.10-xen-sparse/drivers/xen/netfront/netfront.c

index d45b0c3f59f503e2a49ee2342f4b193ebaeea483..05b043c1751e1a46f108421841a9095b2e754bef 100644 (file)
@@ -13,8 +13,8 @@
 #include "common.h"
 #include <asm-xen/balloon.h>
 
+static void netif_idx_release(u16 pending_idx);
 static void netif_page_release(struct page *page);
-static void netif_skb_release(struct sk_buff *skb);
 static void make_tx_response(netif_t *netif, 
                              u16      id,
                              s8       st);
@@ -411,7 +411,7 @@ static void net_tx_action(unsigned long unused)
         mcl[0].args[0] = MMAP_VADDR(pending_idx) >> PAGE_SHIFT;
         mcl[0].args[1] = 0;
         mcl[0].args[2] = 0;
-        mcl++;        
+        mcl++;     
     }
 
     mcl[-1].args[2] = UVMF_FLUSH_TLB;
@@ -531,7 +531,7 @@ static void net_tx_action(unsigned long unused)
 
         pending_idx = pending_ring[MASK_PEND_IDX(pending_cons)];
 
-        data_len = txreq.size > PKT_PROT_LEN ? PKT_PROT_LEN : txreq.size;
+        data_len = (txreq.size > PKT_PROT_LEN) ? PKT_PROT_LEN : txreq.size;
 
         if ( unlikely((skb = alloc_skb(data_len+16, GFP_ATOMIC)) == NULL) )
         {
@@ -592,14 +592,15 @@ static void net_tx_action(unsigned long unused)
         phys_to_machine_mapping[__pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT] =
             FOREIGN_FRAME(txreq.addr >> PAGE_SHIFT);
 
-        data_len = txreq.size > PKT_PROT_LEN ? PKT_PROT_LEN : txreq.size;
+        data_len = (txreq.size > PKT_PROT_LEN) ? PKT_PROT_LEN : txreq.size;
 
         __skb_put(skb, data_len);
         memcpy(skb->data, 
                (void *)(MMAP_VADDR(pending_idx)|(txreq.addr&~PAGE_MASK)),
                data_len);
 
-        if (data_len < txreq.size) {
+        if ( data_len < txreq.size )
+        {
             /* Append the packet payload as a fragment. */
             skb_shinfo(skb)->frags[0].page        = 
                 virt_to_page(MMAP_VADDR(pending_idx));
@@ -607,10 +608,11 @@ static void net_tx_action(unsigned long unused)
             skb_shinfo(skb)->frags[0].page_offset = 
                 (txreq.addr + data_len) & ~PAGE_MASK;
             skb_shinfo(skb)->nr_frags = 1;
-        } else {
-            skb_shinfo(skb)->frags[0].page        = 
-                virt_to_page(MMAP_VADDR(pending_idx));
-            skb->destructor = netif_skb_release;
+        }
+        else
+        {
+            /* Schedule a response immediately. */
+            netif_idx_release(pending_idx);
         }
 
         skb->data_len  = txreq.size - data_len;
@@ -651,14 +653,6 @@ static void netif_page_release(struct page *page)
     netif_idx_release(pending_idx);
 }
 
-static void netif_skb_release(struct sk_buff *skb)
-{
-    struct page *page = skb_shinfo(skb)->frags[0].page;
-    u16 pending_idx = page - virt_to_page(mmap_vstart);
-
-    netif_idx_release(pending_idx);
-}
-
 irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
 {
     netif_t *netif = dev_id;
@@ -747,7 +741,7 @@ static int __init netback_init(void)
     struct page *page;
 
     if ( !(xen_start_info.flags & SIF_NET_BE_DOMAIN) &&
-        !(xen_start_info.flags & SIF_INITDOMAIN) )
+         !(xen_start_info.flags & SIF_INITDOMAIN) )
         return 0;
 
     printk("Initialising Xen netif backend\n");
index fd2cd0b900bc7981520cbb5a7bb779435211a641..61626a7b91673598cc0cab0d6dc222e21bebd0fa 100644 (file)
@@ -273,7 +273,6 @@ static int send_fake_arp(struct net_device *dev)
                      dst_ip, dev, src_ip,
                      /*dst_hw*/ NULL, /*src_hw*/ NULL, 
                      /*target_hw*/ dev->dev_addr);
-    printk(KERN_ALERT "ARP sent on %08x %08x %p\n", dst_ip, src_ip, skb);
     if ( skb == NULL )
         return -ENOMEM;